# ================1.列表================
# @.列表的定义
# x = [元素1, 元素2, ..]
# @.列表的创建

# 创建一个普通列表
x = [2, 1323, '34434']
print(x, type(x))

# 利用range创建
y = list(range(1, 10, 2))
print(y, type(y))

# 利用推导式创建列表
x = [0] * 5
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>

x = [0 for i in range(5)]
print(x, type(x))
# [0, 0, 0, 0, 0] <class 'list'>

x = [i for i in range(10)]
print(x, type(x))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'>

x = [i for i in range(1, 10, 2)]
print(x, type(x))
# [1, 3, 5, 7, 9] <class 'list'>

x = [i for i in range(10, 1, -2)]
print(x, type(x))
# [10, 8, 6, 4, 2] <class 'list'>

x = [i ** 2 for i in range(1, 10)]
print(x, type(x))
# [1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'list'>

x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x, type(x))

# [3, 9, 15, 21, 27, 33, 39,


"""
x = [[0] * 3] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>

a = [0] * 3
x = [a] * 4
print(x, type(x))
# [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'>

x[0][0] = 1
print(x, type(x))
# [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'>
"""

# @.向列表中添加元素
cs = [1, 2, 3, 4, 5, 6, 12]
t = 32
cs_1 = ['a', 'b', 'c']
# @1    list.append(obj) 在列表末尾添加新的对象，只接受一个参数，参数可以是任何数据类型，被追加的元素在 list
cs.append(t)
cs.append(cs_1)
print('append', cs)

# 中保持着原结构类型
# @2    list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值（用新列表扩展原来的列表）
cs.extend(cs_1)
print('extend', cs)

# [1, 2, 3, 4, 5, 6, 12, 32, ['a', 'b', 'c'], 'a', 'b', 'c']
# @3    list.insert(index, obj) 在编号 index 位置前插入 obj 。
cs.insert(2, '22')
print('insert', cs)

# @.删除列表中的元素
# @1  list.remove(obj) 移除列表中某个值的第一个匹配项
cs.remove(3)
print('remove', cs)
# @2    list.pop([index=-1]) 移除列表中的一个元素（默认最后一个元素），并且返回该元素的值
cs.pop()
print('[pop]', cs)
cs_pop = cs.pop(0)
print('[pop]', cs)
cs.pop(-1)
print('[pop -1]', cs)
print('[cs_pop]', cs_pop)
# @3. del var1[, var2 ……] 删除单个或多个对象。

del cs[0:3]
print('[del cs[0:3]]', cs)

# @.获取列表中的元素

# 1. 通过元素的索引值，从列表获取单个元素，注意，列表索引值是从0开始的。
# 2. 通过将索引指定为-1，可让Python返回最后一个列表元素，索引 -2 返回倒数第二个列表元素，以此类推。
list_get = list(range(0, 30))
print('list_get', list_get)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
# 切片的通用写法是 start : stop : step
# 'start:'              -->    start:length
# ':stop'               -->    0:stop
# 'start:stop'          -->    start:stop
# 'start:stop:step'     -->    start:stop:step
# ':'                   -->    复制列表中的所有元素（浅拷贝）。
print('list_get[3:10]', list_get[3:10])
# [3, 4, 5, 6, 7, 8, 9]
print('list_get[3:20:3]', list_get[3:30:3])

print('list_get[:]', list_get[:])
# @.列表的常用操作符
# 1. 等号操作符： ==
# 2. 连接操作符 +
# 3. 重复操作符 *
# 4. 成员关系操作符 in 、 not in
# 「等号 ==」，只有成员、成员位置都相同时才返回True。
# 和元组拼接一样， 列表拼接也有两种方式，用「加号 +」和「乘号 *」，前者首尾拼接，后者复制拼接。
list1 = list(range(0, 10))
list2 = list(range(0, 10))
print('list1 == list2', list1 == list2)  # True

list1_2 = list1 + list2  # extend
print('list1 + list2', list1_2)

print('repeat *3 ', [1, 2, 3] * 3)

print('8 in list1', 8 in list1)
print('12 not in list1', 12 in list1)

# @.列表的其他方法


# list.count(obj) 统计某个元素在列表中出现的次数
print('list1.count(1)', list1.count(1))

# list.index(x[, start[, end]]) 从列表中找出某个值第一个匹配项的索引位置
list_index = [1, 3, 4, 5, 'aa', 7, 'aa', 'aa', 10]
print(list_index.index('aa', 3, 10))  # 4

# list.reverse() 反向列表中元素

list_reverse = list(range(0, 10))
print('list_reverse', list_reverse)
list_reverse.reverse()
print('list_reverse', list_reverse)

# list.sort(key=None, reverse=False) 对原列表进行排序。
list_sort = [3, 42, 15, 6, 12]
print('list_sort', list_sort)
list_sort.sort()
print('list_sort', list_sort)
list_sort.sort(reverse=True)
print('list_sort', list_sort)
